关于qt:设置QFormLayout QLabel的垂直对齐

您所在的位置:网站首页 qt 居中对齐 关于qt:设置QFormLayout QLabel的垂直对齐

关于qt:设置QFormLayout QLabel的垂直对齐

2024-07-05 07:53| 来源: 网络整理| 查看: 265

我正在使用PySide / PyQt,但这是一般的Qt问题。

有没有一种方法可以设置QFormLayout,使标签垂直居中,而不必显式创建QLabel并将其垂直大小策略设置为首先扩展?当第2列中的小部件比我的标签高时,我希望我的标签与小部件垂直居中,而不是与其顶部对齐...

这是一个演示该问题的示例脚本。我将标签涂成红色,以更好地展示其尺寸行为。

12345678910111213141516171819202122232425from PySide import QtCore, QtGui app = QtGui.QApplication([]) widget = QtGui.QWidget() widget.setStyleSheet("QLabel { background-color : red}") layout = QtGui.QFormLayout() layout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow) layout.setLabelAlignment(QtCore.Qt.AlignCenter) editor1 = QtGui.QLineEdit() editor1.setFixedSize(300, 100) editor2 = QtGui.QLineEdit() editor2.setFixedSize(300, 100) layout.addRow('Input', editor1) layout.addRow('Longer Named Input', editor2) widget.setLayout(layout) widget.show() app.exec_()

结果如下:

这是一个通过显式创建QLabel并为其提供扩展尺寸策略来展示所需结果的示例:

1234567891011121314151617181920212223242526272829303132from PySide import QtCore, QtGui app = QtGui.QApplication([]) widget = QtGui.QWidget() widget.setStyleSheet("QLabel { background-color : red}") layout = QtGui.QFormLayout() layout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow) layout.setLabelAlignment(QtCore.Qt.AlignCenter) editor1 = QtGui.QLineEdit() editor1.setFixedSize(300, 100) editor2 = QtGui.QLineEdit() editor2.setFixedSize(300, 100) label1 = QtGui.QLabel('Input') expand = QtGui.QSizePolicy.Expanding label1.setSizePolicy(expand, expand) label2 = QtGui.QLabel('Longer Named Input') label2.setSizePolicy(expand, expand) layout.addRow(label1, editor1) layout.addRow(label2, editor2) widget.setLayout(layout) widget.show() app.exec_()

这就是结果...

我试过QFormLayout.setLabelAlignment()似乎没有帮助。该文档甚至提到setLabelAlignment仅执行标签的水平对齐(即使那样,它似乎也没有居中,只是向左或向右)。

顺便说一句,这使我也尝试将水平对齐方式设置为居中,但这证明更加困难,因为标签不会水平扩展以填充空间(小标签不会扩展以匹配最大标签)。我可以获得水平居中标签的唯一方法是在显示小部件后显式找到最大标签的宽度,然后将所有其他标签设置为相同的宽度...

12345labels = [layout.itemAt(i*2).widget() for i in range(layout.rowCount())] max_width = max(label.width() for label in labels) for w in labels:     w.setFixedWidth(max_width)     w.setAlignment(QtCore.Qt.AlignCenter)

结果如下:

我在QFormLayout级别上缺少什么将标签居中吗?我必须制作QLabels并设置为展开还是在事实发生后再打开(如下所示)?感谢您的任何想法!

1234expand = QtGui.QSizePolicy.Expanding labels = [layout.itemAt(i*2).widget() for i in range(layout.rowCount())] for w in labels:     w.setSizePolicy(expand, expand)

" [2]标签只能左对齐(默认)或右对齐"-我不相信这是真的。

您的代码无法为我运行,因此我无法测试您的确切代码。 但是,此方法适用于其他窗口小部件:请注意使用|分隔各种位置命令。

1label2.setAlignment(PyQt5.QtCore.Qt.AlignLeft|PyQt5.QtCore.Qt.AlignVCenter)

我知道这已经有几年历史了,所以您可能想出了另一种方法,但是这种方法对我来说效果很好。

相关讨论 明天要测试一下。问题在于QFormLayout在标签布局方面存在一套自以为是的局限性,它在内部处理。我认为您显示的行为对于QGridLayout中手动创建的标签非常有意义。当高级便利功能(QFormLayout)无法提供所需的选项时,这可能只是需要删除抽象层(到QGridLayout)的经典情况。谢谢你的建议!我的代码仍然有效,因此改进对我仍然有用。 没有问题,我希望这最终可以为您解决。 这应该是公认的答案。当前接受的答案是错误的主张。

我认为您的问题没有完美的解决方案。 从QFormLayout的源代码:

12345678910111213141516171819202122232425262728void QFormLayoutPrivate::arrangeWidgets(const QVector& layouts, QRect &rect) {     // [...]     if (label) {         int height = layouts.at(label->vLayoutIndex).size;         if ((label->expandingDirections() & Qt::Vertical) == 0) {             /*                 If the field on the right-hand side is tall,                 we want the label to be top-aligned, but not too                 much. So we introduce a 7 / 4 factor so that it                 gets some extra pixels at the top.             */             height = qMin(height,                       qMin(label->sizeHint.height() * 7 / 4,                            label->maxSize.height()));             }    [1]  QSize sz(qMin(label->layoutWidth, label->sizeHint.width()), height);         int x = leftOffset + rect.x() + label->layoutPos;    [2]  if (fixedAlignment(q->labelAlignment(), layoutDirection) & Qt::AlignRight)    [ ]      x += label->layoutWidth - sz.width();    [ ]  QPoint p(x, layouts.at(label->vLayoutIndex).pos);         // ### expansion & sizepolicy stuff         label->setGeometry(QStyle::visualRect(layoutDirection, rect, QRect(p, sz)));     }     // [...] }

我们在这里看到什么?

[1]标签不会水平拉伸 [2]标签只能左对齐(默认)或右对齐

因此,您必须以某种方式手动同步标签的宽度(例如设置固定的宽度)或放弃QFormLayout并使用QGridLayout。

相关讨论 太棒了!感谢您为这种行为提供启示!在Python子类中重写该方法会起作用吗?私有化可以防止这种情况发生吗?但是,尝试覆盖该方法肯定比仅使用QGridLayout麻烦得多,所以我认为这是阻力最小的途径。 @ flutefreak7不,此方法不能被覆盖。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3